/*!
 * \file WtHelper.cpp
 * \project	WonderTrader
 *
 * \author Wesley
 * \date 2020/03/30
 * 
 * \brief UFT助手工具类实现文件
 * 
 * \details 该文件实现了WtHelper工具类的所有静态方法，包括：
 *          - 路径获取和目录管理功能
 *          - 各种系统目录的创建和访问
 *          - 跨平台的目录操作兼容性处理
 *          - 静态成员变量的定义和初始化
 */
#include "WtHelper.h"

#include "../Share/StrUtil.hpp"
#include "../Share/StdUtils.hpp"

#include <boost/filesystem.hpp>

#ifdef _MSC_VER
#include <direct.h>
#else	//UNIX
#include <unistd.h>
#endif

// 静态成员变量定义和初始化
uint32_t WtHelper::_cur_date = 0;		//!< 当前日期，初始化为0
uint32_t WtHelper::_cur_time = 0;		//!< 当前时间，初始化为0
uint32_t WtHelper::_cur_secs = 0;		//!< 当前秒数，初始化为0
uint32_t WtHelper::_cur_tdate = 0;		//!< 当前交易日期，初始化为0
std::string WtHelper::_inst_dir;		//!< 实例目录，默认为空
std::string WtHelper::_gen_dir = "./generated/";	//!< 生成目录，默认为"./generated/"


std::string WtHelper::getCWD()
{
	static std::string _cwd;	// 静态局部变量，用于缓存当前工作目录
	if(_cwd.empty())
	{
		char   buffer[256];
#ifdef _MSC_VER
		// Windows平台使用_getcwd函数
		_getcwd(buffer, 255);
#else	//UNIX
		// Unix/Linux平台使用getcwd函数
		if (getcwd(buffer, 255) == NULL) {
			buffer[0] = '\0';  // 失败时清空缓冲区
		}
#endif
		// 将路径标准化（统一分隔符格式）
		_cwd = StrUtil::standardisePath(buffer);
	}	
	return _cwd;
}

std::string WtHelper::getModulePath(const char* moduleName, const char* subDir, bool isCWD /* = true */)
{
	std::stringstream ss;
	// 根据isCWD参数选择基础目录：当前工作目录或实例目录
	ss << (isCWD?getCWD():getInstDir()) << subDir << "/" << moduleName;
	return ss.str();
}

const char* WtHelper::getStraDataDir()
{
	// 构建策略数据目录路径：生成目录 + "stradata/"
	static std::string folder = StrUtil::standardisePath(_gen_dir) + "stradata/";
	// 如果目录不存在，则创建该目录
	if (!StdFile::exists(folder.c_str()))
		boost::filesystem::create_directories(folder);
	return folder.c_str();
}

const char* WtHelper::getStraUsrDatDir()
{
	// 构建策略用户数据目录路径：生成目录 + "userdata/"
	static std::string folder = StrUtil::standardisePath(_gen_dir) + "userdata/";
	// 如果目录不存在，则创建该目录
	if (!StdFile::exists(folder.c_str()))
		boost::filesystem::create_directories(folder);
	return folder.c_str();
}

const char* WtHelper::getPortifolioDir()
{
	// 构建投资组合目录路径：生成目录 + "portfolio/"
	static std::string folder = StrUtil::standardisePath(_gen_dir) + "portfolio/";
	// 如果目录不存在，则创建该目录
	if (!StdFile::exists(folder.c_str()))
		boost::filesystem::create_directories(folder);
	return folder.c_str();
}

const char* WtHelper::getOutputDir()
{
	// 构建输出目录路径：生成目录 + "outputs/"
	static std::string folder = StrUtil::standardisePath(_gen_dir) + "outputs/";
	// 如果目录不存在，则创建该目录
	if (!StdFile::exists(folder.c_str()))
		boost::filesystem::create_directories(folder);
	return folder.c_str();
}

const char* WtHelper::getBaseDir()
{
	// 返回标准化的生成基础目录路径
	static std::string folder = StrUtil::standardisePath(_gen_dir);
	// 如果目录不存在，则创建该目录
	if (!StdFile::exists(folder.c_str()))
		boost::filesystem::create_directories(folder);
	return folder.c_str();
}